﻿// -------------------------------------------------------------------------------------------------------
// LICENSE INFORMATION
//
// - This software is licensed under the MIT shared source license.
// - The "official" source code for this project is maintained at http://mtcagent.codeplex.com
//
// Copyright (c) 2010 OpenNETCF Consulting
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 
// associated documentation files (the "Software"), to deal in the Software without restriction, 
// including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
// and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial 
// portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
// -------------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.IO;
using System.Reflection;
using OpenNETCF.IoC;
using System.Diagnostics;
using System.Xml.Linq;
using System.Threading;
using System.Security.Policy;
using System.Net;

namespace OpenNETCF.MTConnect
{
    internal class AgentService : IVirtualAgentService
    {
        [EventPublication(EventNames.StatusUpdate)]
        public event EventHandler<GenericEventArgs<StatusSummary>> StatusChanged;

        public event EventHandler RestartRequested;

        private IHostedAdapterService m_adapterService;

        private IMTConnectProvider Provider { get; set; }

        [ServiceDependency]
        private IConfigurationService ConfigService { get; set; }

        [InjectionConstructor]
        public AgentService([ServiceDependency] IMTConnectProvider provider)
        {
            Provider = provider;
            Provider.StatusChanged += new EventHandler<GenericEventArgs<StatusSummary>>(Provider_StatusChanged);
        }

        private IHostedAdapterService HostedAdapterService
        {
            get
            {
                if (m_adapterService == null)
                {
                    m_adapterService = RootWorkItem.Services.Get<IHostedAdapterService>();
                }

                return m_adapterService;
            }
        }

        public IHostedAdapter[] LoadedAdapters
        {
            get { return HostedAdapterService.LoadedAdapters; }
        }

        public void Start()
        {
            Provider.Start();
        }

        void Provider_StatusChanged(object sender, GenericEventArgs<StatusSummary> e)
        {
            RaiseStatusChanged(e);
        }

        public void Stop()
        {
            Provider.Stop();
        }

        public void Restart()
        {
            Provider.Stop();
            RestartRequested.Fire(this, EventArgs.Empty);
        }

        public bool Running
        {
            get { return Provider.Running; }
        }

        public bool AutoStart
        {
            get { return ConfigService.AgentConfiguration.AutoRun; }
        }
        
        public string AgentAddress 
        {
            get { return Provider.AgentAddress; }
        }

        private void RaiseStatusChanged(GenericEventArgs<StatusSummary> summary)
        {
            StatusChanged.Fire(this, summary);
        }

        private void RaiseStatusChanged(StatusSummary summary)
        {
            RaiseStatusChanged(new GenericEventArgs<StatusSummary>(summary));
        }

        private void RaiseStatusChanged(string message)
        {
            RaiseStatusChanged(
                new StatusSummary()
                {
                    Description = message,
                    Source = "[local]",
                    TimeStamp = DateTime.Now
                });
        }
    }
}
